#ifndef __MY_HOT__
#define __MY_HOT__
#include "data.hpp"
#include <unistd.h>

std::unique_ptr<cloud::DataManager> _data(new cloud::DataManager());

namespace cloud
{
    class HotManager
    {
    private:
        std::string _pack_dir;
        std::string _back_dir;
        std::string _pack_suffix;
        int _hot_time;
        bool CheckHot(std::string &filename)
        {
            FileUtil fu(filename);
            time_t last_atime = fu.LastATime();
            time_t cur_time = time(NULL);
            if ((cur_time - last_atime) > _hot_time)
            {
                // 非热点文件
                return true;
            }
            // 热点文件
            return false;
        }

    public:
        HotManager()
        {
            Config *config = Config::GetInstance();
            _pack_dir = config->GetPackDir();
            _back_dir = config->GetBackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();
            // 判断备份文件目录和压缩文件目录是否存在，不存在则创建
            FileUtil fu1(_back_dir);
            FileUtil fu2(_pack_dir);
            fu1.CreateDirectory();
            fu2.CreateDirectory();
        }
        bool RunModule()
        {
            while (1)
            {
                // 1.遍历备份目录，获取所有文件名
                std::vector<std::string> arry;
                FileUtil fu(_back_dir);
                // 遍历获取所有文件名
                fu.ScanDirectory(&arry);
                // 2.遍历判断文件是否为非热点文件
                for (auto &a : arry)
                {
                    if (CheckHot(a) == false)
                    {
                        // 热点文件不需要处理
                        continue;
                    }
                    // 3.获取文件的备份信息
                    BackupInfo info;
                    // 如果文件备份信息不存在，就重新备份一份
                    if (_data->GetOneByRealPath(a, &info) == false)
                    {
                        info.NewBackupInfo(a);
                    }
                    // 4.对非热点文件进行压缩
                    FileUtil fu(a);
                    fu.Compress(info.pack_path);
                    // 5. 删除源文件，修改备份信息
                    fu.Remove();
                    info.pack_flag = true;
                    _data->Update(info);
                }
                // 避免空目录循环遍历，消耗cpu资源过高
                usleep(1000);
            }
            return true;
        }
    };
}
#endif